package edu.tfh.s2.ehkbot.gerete.sensoren;

import edu.tfh.s2.ehkbot.daten.InitFactory;
import edu.tfh.s2.ehkbot.steuerung.Position;
import edu.tfh.s2.ehkbot.steuerung.Richtung;

/**
 * IndoorGPS ist die Klasse die dafür zuständig ist die Position von Roboter zu erfahren. IndoorGPS nutzt das
 * Singelton und State Pattern. Das State Pattern dient dazu zu bestimmen zwischen Simulation und Real zu
 * unterscheiden.
 * 
 * @author s2zehn
 */
public class IndoorGPS {
	/**
	 * IndoorGPSState ist das Interface fur das State von IndoorGPS (siehe State Pattern)
	 */
	public interface IndoorGPSState extends Cloneable {
		/**
		 * @see java.lang.Object#clone()
		 */
		public Object clone();

		/**
		 * Liefert die Aktuelle Position.
		 * 
		 * @return Die Position.
		 */
		public Position getCurrentPosition();

		/**
		 * Liefert die Aktuelle Richtung.
		 * 
		 * @return Die Richtung.
		 */
		public Richtung getRichtung();
	}

	private static IndoorGPS instance;

	/**
	 * getInstance Singelton Pattern Methode.
	 * 
	 * @return Die einzige Instanz von IndoorGPS.
	 */
	public static IndoorGPS getInstance() {
		if (instance == null) {
			instance = new IndoorGPS(InitFactory.getInstance().getIndoorGPS());
		}
		return instance;
	}

	private IndoorGPSState state;

	/**
	 * Konstrukor von IndoorGPS
	 * 
	 * @param state
	 *            Das State welches das Verhalten von IndoorGPS bestimmt.
	 */
	private IndoorGPS(IndoorGPSState state) {
		this.state = state;
	}

	/**
	 * Liefert die Aktuelle Position.
	 * 
	 * @return Die Position.
	 */
	public Position getCurrentPosition() {
		return state.getCurrentPosition();
	}

	/**
	 * Liefert die Aktuelle Richtung.
	 * 
	 * @return Die Richtung.
	 */
	public Richtung getRichtung() {
		return state.getRichtung();
	}
}
